package com.shurdroides.sintesi;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;


import com.google.android.c2dm.server.C2DMessaging;
import com.google.android.c2dm.server.DeviceInfo;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;


/**
 * Accion que se ejecuta cuando un usuario ha variado su posicion y la envia
 * al servidor para ser actualizada. Tras actualizar la posicion en la region especifica
 * notifica a todos los usuarios de esa region mediante c2dm que ha habido cambios de 
 * posicones.
 * @author alumneT
 *
 */
public class ActionMoverse  extends Action{
	private static final Logger log = Logger.getLogger(ActionMoverse.class.getName());
	private Double latitud;
	private Double longitud;
	private Region region;
	
	public ActionMoverse(HttpServletRequest req, EntityManager em, PersistenceManager pm, Region reg, C2DMessaging push){
		setEntityManager(em);
		setPersistenceManager(pm);
		setLatitud(Double.parseDouble(req.getParameter("lat")));
		setLongitud(Double.parseDouble(req.getParameter("lon")));
		setCorreoUsuario(req.getParameter("correoUsu"));
		setPush(push);
		
	}

	@Override
	public boolean executeAction(Region reg) throws IOException {
		//si el usuario no esta registrado lo agrega a la region
		if((reg.getUsuariosPorCorreo().containsKey(getCorreoUsuario()))==false){
			UsuarioHelper uh = new UsuarioHelper(em);
			Usuario u = uh.getByCorreo(getCorreoUsuario());
			u.setLatitud(getLatitud());
			u.setLongitud(getLongitud());
			reg.getUsuariosPorCorreo().put(getCorreoUsuario(), u);
			reg.getUsuarios().put(""+reg.getUsuarios().size(), u);

		}else{
			//si el usuario ya existe modifica sus posiciones
			reg.getUsuariosPorCorreo().get(getCorreoUsuario()).setLatitud(getLatitud());
			reg.getUsuariosPorCorreo().get(getCorreoUsuario()).setLongitud(getLongitud());
			
		}
		//ahora notifica a los usuarios de esa region de los cambios
		Iterator<Usuario> it = reg.getUsuariosPorCorreo().values().iterator();
		while (it.hasNext()) {
			Usuario us =it.next();
			 Key k = KeyFactory.createKey(DeviceInfo.class.getSimpleName(), us.getEmail());
			 DeviceInfo device = pm.getObjectById(DeviceInfo.class, k);
				 if(device.getDeviceRegistrationID()!=getCorreoUsuario()){
					 getPush().sendNoRetry(device.getDeviceRegistrationID(), "collapse", "action", "-1", "cadena", "libre");
				 }
			}
		
		return true;
	}

	public Double getLatitud() {
		return latitud;
	}

	public void setLatitud(Double latitud) {
		this.latitud = latitud;
	}

	public Double getLongitud() {
		return longitud;
	}

	public void setLongitud(Double longitud) {
		this.longitud = longitud;
	}

	public Region getRegion() {
		return region;
	}

	public void setRegion(Region region) {
		this.region = region;
	}


}
